#include<bits/stdc++.h>
#define int long long
using namespace std;
typedef __int128 ll;
const int V=1e9,I=1e18,P=998244353;
inline void chmax(int &x,int y){
  if(y>x)x=y;
}
inline void chmax(ll &x,ll y){
  if(y>x)x=y;
}
inline void self_add(int &x,int y){
  if((x+=y)>=P)x-=P;
}
main(){
  freopen("b.in","r",stdin);
  freopen("b.out","w",stdout);
  ios::sync_with_stdio(false);
  cin.tie(0); cout.tie(0);
  int n,w=0; cin>>n;
  vector<int> v(n),c(n),x(n-1);
  for(auto &i:v)cin>>i;
  for(auto &i:c)cin>>i;
  for(auto &i:x)cin>>i;
  if(*min_element(x.begin(),x.end())==V){
    for(int i=0;i<n;i++)
      self_add(w,c[i]*v[i]%P);
    cout<<w<<endl,exit(0);
  }
  if(*max_element(x.begin(),x.end())==1){
    for(int i=n-1;i;i--)
      v[i-1]=max(v[i-1],v[i]);
    for(int i=0;i<n;i++)
      self_add(w,c[i]*v[i]%P);
    cout<<w<<endl,exit(0);
  }
  int N=max({n,*max_element(c.begin(),c.end()),*max_element(v.begin(),v.end())});
  if(N<=300){
    int S=accumulate(c.begin(),c.end(),0ll);
    vector<int> f(S+1,-I);
    for(int i=f[0]=0;i<n-1;i++){
      vector<int> g(S+1,-I);
      for(int j=S,w=-I;j>=0;j--){
        if(j>=c[i])w=max(w,f[j-c[i]]+j*v[i]);
        if(!(j%x[i]))chmax(g[j/x[i]],w-j*v[i]);
      }
      swap(f,g);
    }
    for(int i=0;i<=S;i++)
      chmax(w,f[i]+(i+c[n-1])*v[n-1]);
    cout<<w%P<<endl,exit(0);
  }
  if(N<=2000){
    int S=min(accumulate(c.begin(),c.end(),0ll),60000ll);
    vector<int> f(S+1,-I);
    for(int i=f[0]=0;i<n-1;i++){
      vector<int> g(S+1,-I);
      for(int j=S,w=-I;j>=0;j--){
        if(j>=c[i])w=max(w,f[j-c[i]]+j*v[i]);
        if(!(j%x[i]))chmax(g[j/x[i]],w-j*v[i]);
      }
      swap(f,g);
    }
    for(int i=0;i<f.size();i++)
      chmax(w,f[i]+(i+c[n-1])*v[n-1]);
    cout<<w%P<<endl,exit(0);
  }
  for(int i=0;i<n-1;i++)
    for(int j=i+1,s=1;j<min(i+20,n)&&s<=V*V;j++)
      if((ll)v[i]*(s*=x[j-1])<v[j])
        c[j]+=c[i]/s,c[i]%=s;
  for(int i=0;i<n;i++)
    self_add(w,c[i]*v[i]%P);
  cout<<w<<endl;
  return 0;
}